// 头文件引入
#include "rclcpp/rclcpp.hpp"
#include "rclcpp_lifecycle/lifecycle_node.hpp" // 头文件包含了生命周期节点的相关功能,允许开发者控制节点的状态(如配置,激活,失活和关闭)

// 类型定义
// 定义CallbackReturn 类型，方便后续使用
// 这个类型用于表示
using CallbackReturn =
    rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn;

// 类定义
// 定义一个名为LearnLifeCycleNode的类,继承自LifecycleNode,ROS2中用于管理节点生命周期的基类
class LearnLifeCycleNode : public rclcpp_lifecycle::LifecycleNode
{
public:
    // 构造函数
    // 构造函数中初始化节点名称为 lifecyclenode,设置定时器周期为1.0秒,并打印节点创建信息
    LearnLifeCycleNode()
        : rclcpp_lifecycle::LifecycleNode("lifecyclenode")
    {
        timer_period_ = 1.0;
        timer_ = nullptr;
        RCLCPP_INFO(get_logger(), "%s: 已创建", get_name());
    }

    // 生命周期回调函数
    // 在节点配置阶段被调用。可以在此设置参数或进行初始化。
    CallbackReturn on_configure(const rclcpp_lifecycle::State &state) override
    {
        (void)state;
        timer_period_ = 1.0;
        RCLCPP_INFO(get_logger(), "on_configure():配置周期 timer_period");
        return CallbackReturn::SUCCESS; // 表示配置成功
    }

    // 在节点激活时调用,创建一个定时器,每秒打印一次信息
    /**
     * create_wall_timer的基本用法
     * 语法如下：
     * auto timer = create_wall_timer(
     *     std::chrono::duration<double>(duration_in_seconds),
     *     callback_function);
     * 
     * 第一个参数是一个 std::chrono::duration 类型，表示定时器的触发间隔，例如, std::chrono::seconds(1)表示每秒触发一次。
     * 第二个参数是一个可调用对象(如lambda函数、普通函数或成员函数)，当定时器到达指定周期时会被调用。
     */
    CallbackReturn on_activate(const rclcpp_lifecycle::State &state) override
    {
        (void)state;
        timer_ = create_wall_timer(
            std::chrono::seconds(static_cast<int>(timer_period_)),
            [this]()
            { RCLCPP_INFO(get_logger(), "定时器打印进行中..."); });
        RCLCPP_INFO(get_logger(), "on_activate():处理激活指令，创建定时器");
        return CallbackReturn::SUCCESS; // 返回成功状态
    }

    // 在节点失活时调用,停止并重置定时器
    CallbackReturn on_deactivate(const rclcpp_lifecycle::State &state) override
    {
        (void)state;
        timer_.reset(); // 停止并重置定时器
        RCLCPP_INFO(get_logger(), "on_deactivate():处理失活指令，停止定时器");
        return CallbackReturn::SUCCESS;
    }

    // 在节点关闭时调用,停止并重置定时器
    CallbackReturn on_shutdown(const rclcpp_lifecycle::State &state) override
    {
        (void)state;
        timer_.reset(); // 停止定时器
        RCLCPP_INFO(get_logger(), "on_shutdown():处理关闭指令");
        return CallbackReturn::SUCCESS;
    }

private:
    rclcpp::TimerBase::SharedPtr timer_;
    double timer_period_;
};

int main(int argc, char **argv)
{
    rclcpp::init(argc, argv);                           // 初始化ROS2
    auto node = std::make_shared<LearnLifeCycleNode>(); // 创建生命周期节点实例
    // get_node_base_interface是ROS2中Node类的一个成员函数,用于获取节点的基础接口(Base Interface)
    // 调用get_node_base_interface()可以获取其基础接口,并将其传递给rclcpp::spin函数
    // get_node_base_interface是一个重要的接口,用于在ROS2中获取节点的基本功能, 尤其是在使用生命周期节点时,它帮助开发者在控制节点状态的同时,
    // 仍然能够使用节点的核心功能。
    rclcpp::spin(node->get_node_base_interface()); // 进入事件循环
    rclcpp::shutdown();
    return 0;
}